<?

class xmlDriver extends ObjectClass {

	/* ---------------------------------
	 |            PUBLIQUE            |
	 ---------------------------------*/



	function initData () {
	}


	function Purge() {
		//Aucun champ a purger, car on ne peut pas en creer
	}


	function checkNew(){
		$M = $this->Module;
		$Limits = $GLOBALS["Systeme"]->Modules[$M]->Db->LimRequete ;
		$Tab = xmlDriver::searchAll("DATE");
		if (empty($Tab)) return false;
		//Comparaison ac un autre driver
		if (!empty($this->Conf["COMPARE"]))
		{
			$Query=$this->Module."/".$this->titre;
			$TabDriver = $GLOBALS["Systeme"]->Modules[$M]->callData($Query);
			//Si l'id n'est pas dans le retour xml, on supprime l'objet
			if (is_array($TabDriver)) foreach ($TabDriver as $Res){
				if (!array_key_exists($Res["Id"],$Tab)){
					$Object = new genericClass($this->Module);
					$Object->initFromArray($Res);
					$Object->setDelete();
				}
			}
		}
		foreach ($Tab as $Key=>$Creation){
			$Creation["Id"] = $Key;
			//Si un ajout doit engendrer d'autres ajouts
			if(!empty($this->Conf["ONNEWUPDATE"])){
				$Conf = $this->Conf["ONNEWUPDATE"];
				$i = $GLOBALS["Systeme"]->Modules[$M]->Db->findByTitle($Conf);
				$Drv = $GLOBALS["Systeme"]->Modules[$M]->Db->ObjectClass[$i]->Conf["WHENASKEDCHECKFROM"];
				$GLOBALS["Systeme"]->Modules[$M]->Db->ObjectClass[$i]->checkNew($Drv,$Creation);
			}
			$Generic = new genericClass($this->Module,$Creation);
			if (is_array($this->childOf)) foreach ($this->childOf as $Parent){
				$Generic->addFkey($Parent["Titre"],$Creation[$Parent["Champ"]]);
			}
			$Generic->Save();
		}
		$GLOBALS["Systeme"]->Modules[$this->Module]->Db->LimRequete = $Limits;
	}



	function Search($Recherche="",$BlurSearch=false){
		$XmlResults = xmlDriver::getXmlArray();
		$Recherche = urldecode($Recherche);
		if($Recherche[0]=="~") {
			$Recherche=substr($Recherche,1,strlen($Recherche));
			settype($Recherche,gettype(eval("return $Recherche;")));
			return xmlDriver::searchObject($Recherche,true);
		}
		$typeAnalyse = 0;
		if (!preg_match("#[\D]+#",$Recherche)){
			foreach($Balise as $Rech){
				if ($Rech["Id"]==$Recherche){
					return xmlDriver::analyzeSearch($Rech,$Recherche,$typeAnalyse);
				}
			}
		}
		$typeAnalyse = 1;
		foreach ($Balise as $Rech){
			if (array_search($Recherche,$Rech)){
				return xmlDriver::analyzeSearch($Rech,$Recherche,$typeAnalyse);
			}
		}
		$typeAnalyse = 2;
		foreach ($Balise as $Rech){
			foreach ($Rech as $Prop){
				if (explode($Recherche,$Prop)>0){
					return xmlDriver::analyzeSearch($Rech,$Recherche,$typeAnalyse);
				}
			}
		}
		return false;
	}


	function getXmlArray(){
		//Si le fichier n'existe pas: faux
		if (!file_exists($this->Conf["FILE"])) return false;
		$XmlContent = new xml2array($this->Conf["FILE"]);
		return $XmlContent->getResult();
	}


	function searchAll($Opt="NO"){
		$XmlResults = xmlDriver::getXmlArray();
		if ($XmlResults == false) return false;
		//print_r($XmlResults);
		foreach($this->Proprietes as $Key=>$Value){
			if ($Value["type"]=="id") $ChampId = $Key;
		}
		if (empty($ChampId)) return false;
		foreach ($XmlResults["export"]["#"]["BIEN"] as $Bien){
			$Id = $Bien["#"][$ChampId][0]['#'];
			foreach($this->Proprietes as $Key=>$Value){
				$Valeur = $Bien["#"][$Key][0]['#'];
				if ($Opt=="DATE") $Results[$Id][$Key] = $Valeur;
			}
			$Results[$Id]["ObjectType"] = $this->titre;
			$Results[$Id]["AdrObj"] = $this->Conf["FILE"];
		}
		return $Results;
	}


	function multiSearch($Recherche){
		$Recherche = urldecode($Recherche);
		$TabRecherche = explode ("&",$Recherche);
		for($i=0;$i<count($TabRecherche);$i++){
			preg_match("#(.*)([\=<>\!]{1,2})(.*)#",$TabRecherche[$i],$RawTab);
			if (!empty($RawTab["3"])){
				$Tab[$i]["Champ"] = $RawTab[1];
				if ($RawTab[2]=="=") $RawTab[2]="==";
				if ($RawTab[2]=="!") $RawTab[2]="!=";
				if ($RawTab[2]==">") $RawTab[2]=">=";
				if ($RawTab[2]=="<") $RawTab[2]="<=";
				$Tab[$i]["Oper"] = $RawTab[2];
				$Tab[$i]["Valeur"] = $RawTab[3];
			}
		}
		$Fichiers = xmlDriver::searchAll();
		foreach ($Fichiers as $File){
			$Note = 0;
			foreach ($Tab as $Test){
				$Valeur = $Test["Valeur"];
				$Oper = $Test["Oper"];
				$Champ = $Test["Champ"];
				eval ("if (\$File['".$Champ."']".$Oper."\"".$Valeur."\") \$Note++;");
			}
			if ($Note == count($Tab)) {$Results[]=$File;}
		}
		return $Results;
	}


	function getReference(){
	}


	function getReflexiveRelatives($id,$typeSearch,$Parametres=''){
		//A FAIRE
	}


	function getBeacon($Var,$Data,$SupVar){
	}

	function getFkeyRelatives($id,$typeSearch,$Recherche,$Card,$Parametres=''){
		//A FAIRE
	}


	function insertObject(){
	}


	function createData(){
	}

	function insertKey($Tab,$Type){
	}


	function Erase($Id){
	}


	function EraseAssociation($Relative,$ObjId,$Type){
	}


	function init() {
	}


	function saveData(){
	}

	function analyzeSearch($Donnees, $Recherche, $Tri=false) {
		objectClass::createTargets();
		$Resultat= Array(); $compteur=0;
		$totalCibles=count($this->Cibles);
		//On procede au calcul de la note que l'on enregistre, avec le reste, dans le tableau final
		while($Enregistrement=mysql_fetch_assoc($Donnees)){
			$sOrder = $totalCibles+1;
			$Resultat[$compteur] = $Enregistrement;
			$Resultat[$compteur]['ObjectType'] = $this->titre;
			if ($Tri==0) $Resultat[$compteur]['note'] = 10;
			if ($Tri==1) {
				$tabTemp = array_keys($Enregistrement,$Recherche);
				foreach ($tabTemp as $Clef){
					if ($this->Cibles[$Clef]<$sOrder){
						$sOrder = $this->Cibles[$Clef];
						$Resultat[$compteur]['note'] = (10/$totalCibles)*($totalCibles-($sOrder/$totalCibles));
					}
				}
			}
			if ($Tri==2) {
				foreach ($Enregistrement as $clefEnr=>$valeurEnr){
					foreach ($this->Cibles as $valeurCible){
						$Resultat[$compteur]['note'] =  (preg_match('!'.$Recherche.'!i', $valeurEnr) && $clefEnr== $valeurCible['nom']) ? objectClass::calcNote($valeurEnr,$Recherche,$valeurCible['searchorder']): 10;
					}
				}
			}
			$compteur++;
		}
		if ($Tri == 2 && $Tri == 1) $Resultat = objectClass::bubbleSort($Resultat,'note');
		return $Resultat;
	}

}